package com.example.sdk.filter;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.*;

/**
 * Created by roger on 2019/1/8.
 */
public class EncryptServletRequest extends HttpServletRequestWrapper {

    Map<String, String> dataMap;

    private HttpServletRequest request;

    public EncryptServletRequest(HttpServletRequest request) throws IOException {
        super(request);
        this.request = request;
    }

    public EncryptServletRequest(HttpServletRequest request, Map<String, String> dataMap) throws IOException {
        super(request);
        this.request = request;
        this.dataMap = dataMap;
    }

    @Override
    public ServletRequest getRequest() {
        return request;
    }

    private List<String> excludeNames;

    @Override
    public String getParameter(String name) {
        if (excludeNames != null && excludeNames.contains(name)) {
            return super.getParameter(name);
        }
        if (dataMap != null && dataMap.containsKey(name)) {
            return dataMap.get(name);
        }
        return super.getParameter(name);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        // xwork便使用此方法取值
        // 该方法返回一个Map，Map映射了客户端请求对应的键值(K,V)。
        if (dataMap != null) {
            Map<String, String[]> map = new HashMap<String, String[]>();
            Set<Map.Entry<String, String>> entrySet = dataMap.entrySet();
            for (Map.Entry<String, String> entry : entrySet) {
                map.put(entry.getKey(), new String[]{entry.getValue()});
            }
            return map;
        } else {
            return super.getParameterMap();
        }
    }

    @Override
    public Enumeration getParameterNames() {
        Enumeration enumeration = Collections.enumeration((Collection) this.dataMap.keySet());
        return enumeration;
    }

    @Override
    public String[] getParameterValues(String name) {
        // Struts1使用此方法取得所有的参数值
        if (excludeNames != null && excludeNames.contains(name)) {
            return super.getParameterValues(name);
        }

        if (dataMap != null && dataMap.containsKey(name)) {
            return new String[]{dataMap.get(name)};
        }
        return super.getParameterValues(name);
    }


    /**
     * 去除一个Object类型对应的前后空格，因为客户端提交参数有两种，一种：String，另一种：String[]，此方法会自动判断调用哪个方法。
     *
     * @param value 需要处理的参数。
     * @return 处理后的值。
     */
    protected Object trim(Object value) {
        if (value instanceof String[]) {
            return trim((String[]) value);
        }
        return trim(value.toString());
    }

    /**
     * 去除某个字符串的前后空格。
     *
     * @param value 需要处理的参数。
     * @return 处理后的值。
     */
    protected String trim(String value) {
        if (value != null && value.length() > 0) {
            return value.trim();
        }
        return value;
    }

    /**
     * 去除某个数组中所有的值的前后空格。
     *
     * @param values 需要处理的数组。
     * @return 处理后的值，当数组的length为1时，则返回一个String，反之返回一个数组。
     */
    protected Object trim(String[] values) {
        if (values != null && values.length > 0) {
            int len = values.length;
            for (int i = 0; i < len; i++) {
                values[i] = trim(values[i]);
            }
        }
        if (values.length == 1) {
            return values[0];
        }
        return values;
    }

    /**
     * @return 不处理的对象。
     */
    public List<String> getExcludeNames() {
        return excludeNames;
    }

    public void setExcludeNames(List<String> excludeNames) {
        this.excludeNames = excludeNames;
    }
}
